package com.ruoyi.learn.java.design.pattern.struct;

/**
 * 适配器模式 (Adapter Pattern) 示例：让 AdvancedAudioPlayer 适配 MusicPlayer 接口。
 */
public class AdapterPatternDemo {

    //region ========== 1. 目标接口 (Target Interface) ==========

    /**
     * 目标接口：音乐播放器
     * 客户端期望的接口。
     */
    public interface MusicPlayer {
        void play(String audioType, String fileName);
    }

    //endregion

    //region ========== 2. 被适配者 (Adaptee) ==========

    /**
     * 被适配者：高级音频播放器
     * 已经存在的类，具有特殊功能，但接口不兼容。
     */
    public static class AdvancedAudioPlayer {
        public void playVlc(String fileName) {
            System.out.println("正在播放 VLC 文件: " + fileName);
        }

        public void playMp4(String fileName) {
            System.out.println("正在播放 MP4 文件: " + fileName);
        }
    }

    //endregion

    //region ========== 3. 适配器 (Adapter) - 对象适配器 ==========

    /**
     * 适配器：VLC 播放器适配器
     * 实现目标接口 (MusicPlayer)，并持有被适配者 (AdvancedAudioPlayer) 的实例。
     */
    public static class VlcPlayerAdapter implements MusicPlayer {
        private AdvancedAudioPlayer advancedPlayer; // 持有被适配者实例

        public VlcPlayerAdapter() {
            this.advancedPlayer = new AdvancedAudioPlayer();
        }

        /**
         * 将目标接口的 play 请求转换为对被适配者的 playVlc 调用。
         * 只处理 audioType 为 "vlc" 的情况。
         */
        @Override
        public void play(String audioType, String fileName) {
            if ("vlc".equalsIgnoreCase(audioType)) {
                advancedPlayer.playVlc(fileName);
            } else {
                System.out.println("VlcPlayerAdapter 不支持播放 " + audioType + " 格式文件。");
            }
        }
    }

    /**
     * 适配器：MP4 播放器适配器
     * 同样实现 MusicPlayer 接口，适配 AdvancedAudioPlayer 的 playMp4 方法。
     */
    public static class Mp4PlayerAdapter implements MusicPlayer {
        private AdvancedAudioPlayer advancedPlayer;

        public Mp4PlayerAdapter() {
            this.advancedPlayer = new AdvancedAudioPlayer();
        }

        @Override
        public void play(String audioType, String fileName) {
            if ("mp4".equalsIgnoreCase(audioType)) {
                advancedPlayer.playMp4(fileName);
            } else {
                System.out.println("Mp4PlayerAdapter 不支持播放 " + audioType + " 格式文件。");
            }
        }
    }

    //endregion

    //region ========== 4. 组合适配器 (可选) ==========

    /**
     * 组合适配器：高级音乐播放器适配器
     * 一个适配器可以适配多个功能，或者适配器本身也作为被适配者。
     * 这里我们创建一个能同时处理 vlc 和 mp4 的适配器。
     */
    public static class AdvancedMusicPlayerAdapter implements MusicPlayer {
        private AdvancedAudioPlayer advancedPlayer;

        public AdvancedMusicPlayerAdapter() {
            this.advancedPlayer = new AdvancedAudioPlayer();
        }

        @Override
        public void play(String audioType, String fileName) {
            switch (audioType.toLowerCase()) {
                case "vlc":
                    advancedPlayer.playVlc(fileName);
                    break;
                case "mp4":
                    advancedPlayer.playMp4(fileName);
                    break;
                default:
                    System.out.println("AdvancedMusicPlayerAdapter 不支持播放 " + audioType + " 格式文件。");
            }
        }
    }

    //endregion

    //region ========== 5. 客户端 (Client) ==========

    /**
     * 音乐播放器客户端
     * 它只知道目标接口 MusicPlayer，不关心具体是哪种播放器。
     */
    public static class MusicPlayerClient {
        private MusicPlayer player;

        public MusicPlayerClient(MusicPlayer player) {
            this.player = player;
        }

        public void playMusic(String audioType, String fileName) {
            System.out.println("[客户端] 请求播放: " + audioType + " - " + fileName);
            player.play(audioType, fileName);
        }
    }

    //endregion

    //region ========== 6. 主函数 (Main) - 演示适配器模式 ==========

    public static void main(String[] args) {
        System.out.println("=== 适配器模式演示 ===\n");

        // 1. 创建适配器实例
        MusicPlayer vlcAdapter = new VlcPlayerAdapter();
        MusicPlayer mp4Adapter = new Mp4PlayerAdapter();
        MusicPlayer advancedAdapter = new AdvancedMusicPlayerAdapter();

        // 2. 创建客户端并使用适配器
        System.out.println("--- 使用 VLC 适配器 ---");
        MusicPlayerClient client1 = new MusicPlayerClient(vlcAdapter);
        client1.playMusic("vlc", "movie.vlc");
        client1.playMusic("mp3", "song.mp3"); // 不支持

        System.out.println("\n--- 使用 MP4 适配器 ---");
        MusicPlayerClient client2 = new MusicPlayerClient(mp4Adapter);
        client2.playMusic("mp4", "video.mp4");
        client2.playMusic("wav", "sound.wav"); // 不支持

        System.out.println("\n--- 使用高级音乐播放器适配器 ---");
        MusicPlayerClient client3 = new MusicPlayerClient(advancedAdapter);
        client3.playMusic("vlc", "documentary.vlc");
        client3.playMusic("mp4", "concert.mp4");
        client3.playMusic("mp3", "classic.mp3"); // 不支持

        // 3. 演示直接使用被适配者（对比）
        System.out.println("\n--- 直接使用被适配者 (AdvancedAudioPlayer) ---");
        AdvancedAudioPlayer directPlayer = new AdvancedAudioPlayer();
        directPlayer.playVlc("direct.vlc");
        directPlayer.playMp4("direct.mp4");
        // directPlayer.play("mp3", "direct.mp3"); // 编译错误！没有 play 方法
    }

    //endregion
}
